#ifndef DEBUG_H
#define DEBUG_H

#include <stdio.h>
#include <stm32f4xx.h>

// DEBUG引脚
#define DEBUG_RX GPIO_Pin_9  // RX
#define DEBUG_TX GPIO_Pin_10 // TX

// USART引脚
#define DEBUG_USART_RX GPIO_PinSource9  // RX
#define DEBUG_USART_TX GPIO_PinSource10 // TX

// GPIO
#define DEBUG_GPIO GPIOA                                                                  // GPIOA组
#define DEBUG_GPIO_Pin (DEBUG_RX | DEBUG_TX)                                              // DEBUG脚
#define DEBUG_RCC_APBPeriphClockCmd RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE) // APB时钟
#define DEBUG_RCC_AHBPeriphClockCmd RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE)  // AHB时钟

// USART
#define DEBUG_USART USART1                 // USART1组
#define DEBUG_USART_BaudRate 9600          // USART波特
#define DEBUG_GPIO_AF_USART GPIO_AF_USART1 // 复用USART

/**
 * @name debug初始化
 * @description
 * @function
 * @returns {void}
 * @requires []
 */
void debug_init(void);

/**
 * @name debug发送数据
 * @description
 * @function
 * @param {uint8_t} ch 字符
 * @returns {void}
 * @requires [ch]
 */
void debug_send(const uint8_t ch);

/**
 * @name debug接收数据
 * @description
 * @function
 * @returns {uint8_t} 数据
 * @requires []
 */
uint8_t debug_recv(void);

#define DEBUG                    \
    int fputc(int ch, FILE *f) { \
        debug_send(ch);          \
        return ch;               \
    }                            \
                                 \
    int fgetc(FILE *f) {         \
        return debug_recv();     \
    }

#endif
